import socket
import threading

# 定义处理客户端连接的函数
def handle_client(client_socket, client_id, clients):
    # 无限循环等待接收客户端消息
    while True:
        try:
            # 尝试从客户端接收消息（最大1024字节），并解码为utf-8字符串
            message = client_socket.recv(1024).decode('utf-8')
            if not message:  # 如果没有接收到任何数据，则断开连接
                break
            print(f"Received from {client_id}: {message}")  # 打印接收到的消息

            # 根据消息类型进行不同处理
            if message.startswith("PLAYER_ID"):  # 忽略PLAYER_ID消息
                continue

            elif message.startswith("GAME_START"):  # 如果是游戏开始消息，则广播给所有客户端
                for c in clients.values():
                    c.sendall(message.encode('utf-8'))

            elif message.startswith("CHAT") or message.startswith("MOVE"):  # 聊天或移动消息发送给另一个玩家
                other_client_id = 3 - client_id  # 计算对方的ID（假设有两个玩家）
                if other_client_id in clients:  # 检查对方是否在线
                    clients[other_client_id].sendall(message.encode('utf-8'))  # 发送消息给对方

        except Exception as e:  # 捕获异常，例如网络错误
            print(f"Error handling client {client_id}: {e}")
            break  # 出现错误时退出循环

    # 关闭客户端套接字，并从clients字典中删除该客户端
    client_socket.close()
    del clients[client_id]

# 定义主函数，用于启动服务器并接受客户端连接
def main():
    host = '0.0.0.0'  # 监听所有可用网络接口
    port = 12345  # 设置监听端口
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建TCP/IP套接字
    server_socket.bind((host, port))  # 绑定地址和端口到套接字
    server_socket.listen(2)  # 开始监听，允许的最大连接数为2
    print(f"Server started on {host}:{port}")  # 打印服务器启动信息

    clients = {}  # 存储已连接客户端的字典
    player_id = 1  # 初始化玩家ID

    # 接受两个客户端连接
    while len(clients) < 2:
        client_socket, addr = server_socket.accept()  # 接受一个新连接
        print(f"Accepted connection from {addr}")  # 打印连接信息
        clients[player_id] = client_socket  # 添加客户端到字典
        client_socket.sendall(f"PLAYER_ID {player_id}\n".encode('utf-8'))  # 发送玩家ID给客户端
        # 启动线程来处理客户端通信
        threading.Thread(target=handle_client, args=(client_socket, player_id, clients)).start()
        player_id += 1  # 增加玩家ID，准备下一个玩家

    # 当两个玩家都已连接后，发送GAME_START消息给所有客户端以开始游戏
    for client_socket in clients.values():
        client_socket.sendall("GAME_START\n".encode('utf-8'))

if __name__ == "__main__":
    main()  # 如果脚本作为主程序运行，则调用main函数启动服务器